/**
 *
 */
package com.priox.sigar.application.writer;

import com.priox.sigar.application.acreedor.RegistroAcreedorApp;
import com.priox.sigar.application.cuentacontable.RegistroCuentaContableApp;
import com.priox.sigar.application.mappers.AcreedorMapper;
import com.priox.sigar.application.mappers.CheckPointMapper;
import com.priox.sigar.application.sociedad.RegistroSociedadApp;
import com.priox.sigar.client.dto.*;
import com.priox.sigar.client.flt.CuentaContableFlt;
import com.priox.sigar.client.flt.DocumentoAcreedorFlt;
import com.priox.sigar.domain.model.constantes.Constantes;
import com.priox.sigar.enums.TipoCuenta;
import com.priox.sigar.server.infrastructure.persistence.util.DateUtil;
import com.priox.sigar.util.TimeObserver;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.item.ItemWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Component
public class OperacionCuentaItemWriter implements ItemWriter<OperacionCuentaDTO> {

    private static final Logger LOGGER = LoggerFactory.getLogger("jobLog");
    private static final Logger LOG = LoggerFactory.getLogger(OperacionCuentaItemWriter.class);
    private JdbcTemplate jdbcTemplate;

    protected List<DocumentoAcreedorDTO> documentosAcreedorNoEncontradosList = new ArrayList<DocumentoAcreedorDTO>();
    @Autowired
    private DataSource dataSource;

    @Autowired
    private RegistroCuentaContableApp cuentaContableMapper;

    @Autowired
    private RegistroAcreedorApp registroAcreedorApp;

    @Autowired
    private AcreedorMapper acreedorMapper;

    @Autowired
    private CheckPointMapper checkPointMapper;

    @Autowired
    private RegistroSociedadApp sociedadMapper;


    @PostConstruct
    public void init() {
        this.jdbcTemplate = new JdbcTemplate(dataSource);

    }


    /* (non-Javadoc)
     * @see org.springframework.batch.item.ItemWriter#write(java.util.List)
     */
    public void write(final List<? extends OperacionCuentaDTO> items) throws Exception {

        String sql = "INSERT INTO dbo.SGTM_OPERACION_CUENTA(acreedor_id, acreedor_Documento, acreedor_Razon_Social, " +
                "agrupacion_Codigo, agrupacion_Id, agrupacion_Nombre, anulado_Con, cPag, codigo_Bp, codigo_Clas, " +
                "codigo_Ir, CODIGO_L1 , codigo_Moneda, codigo_Vp,  cuenta_Contable_ID," +
                "doc_Comp, fecha_Base, fecha_Contable, fecha_Documento, fecha_Vencimiento_Neto," +
                "monto_Moneda_Dolares, monto_Moneda_Local, numero_Documento, referencia, sociedad_id, sociedad_nombre, texto," +
                "usuario,checkpoint_id,NUMERO_DOCUMENTO_COMPRA,TIPO_RANGO,MONTO_IMPORTE_VALORADO,TIPO_RANGO_DOCUMENTO,CODIGO_CE,FECHA_CONTABLE_ORIGINAL,POSICION,USUARIO_TRANSACCIONAL) VALUES ( ?,?,?,?,?, ?,  ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?, ?,?,?,?,?,?,? ,?,? )";

        try {

            Long checkPointId = null;
            if (items.size() > 0) {
                checkPointId = items.get(0).getCheckPointId();
            }

            TimeObserver timeObserver = new TimeObserver("insert del bloque en ");
            timeObserver.empezar();
            int[] rows = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {

                public void setValues(PreparedStatement ps, int i) throws SQLException {

                    OperacionCuentaDTO customer = items.get(i);
                    CuentaContableFlt cuentaContableFlt = new CuentaContableFlt();
                    cuentaContableFlt.setCuentaContableId(customer.getCuentaContableId());
                    cuentaContableFlt.setUsuarioId(customer.getUsuarioId());
                    cuentaContableFlt.setTipoCuenta(customer.getTipoCuenta());

                    List<CuentaContableDTO> cuentas = new ArrayList<CuentaContableDTO>();
                    if (!TipoCuenta.CUENTA_RESUMEN.equals(customer.getTipoCuenta())) {
                        cuentas = cuentaContableMapper.findByCuentaUsuarioId(cuentaContableFlt);
                    }


                  /*  if (!TipoCuenta.CUENTA_RESUMEN.equals(customer.getTipoCuenta()) &&
                            !Constantes.ACREEDOR_ID_NO_EXISTE.equals(customer.getAcreedorId()) &&
                            (Constantes.ACREEDOR_NOMBRE_NO_EXISTE.equals(customer.getAcreedorRazonSocial()))) {
                        List<AcreedorDTO> acreedores = registroAcreedorApp.findByAcreedorId(customer.getAcreedorId());
                        if (acreedores.size() > 0) {
                            customer.setAcreedorRazonSocial(acreedores.get(0).getRazonSocial());
                        } else {
                            customer.setAcreedorRazonSocial(Constantes.ACREEDOR_NOMBRE_NO_REGISTRADO);
                        }

                    }
                       */

                    if (cuentas.size() > 0) {

                        customer.setAgrupacionId(cuentas.get(0).getAgrupacionId());
                        customer.setAgrupacionNombre(cuentas.get(0).getAgrupacionNombre());
                        customer.setAgrupacionCodigo(cuentas.get(0).getAgrupacionCodigo());
                        customer.setCuentaContableDescripcion(cuentas.get(0).getDescripcion());
                        customer.setCuentaContableId(cuentas.get(0).getCuentaContableId());
                    }

                    if (TipoCuenta.CUENTA_ALMACEN.equals(customer.getTipoCuenta())) {
                        customer.setAgrupacionId(1l);
                        customer.setAgrupacionNombre("CUENTAS DE ALMACEN");
                        customer.setFechaCorte(new Date());



                        if (StringUtils.isBlank(customer.getAcreedorId())) {
                            customer.setAcreedorId(Constantes.ACREEDOR_ID_NO_EXISTE);
                        }

                        if (StringUtils.isBlank(customer.getAcreedorRazonSocial())) {

                            customer.setAcreedorRazonSocial(Constantes.ACREEDOR_NOMBRE_NO_REGISTRADO);

                        }

                        //LOG.debug("log 1> "+customer);
                        //    if (Constantes.ACREEDOR_ID_NO_EXISTE.equals(customer.getAcreedorId()) && StringUtils.isNotBlank(customer.getNumeroDocumentoCompra())) {
                        if (StringUtils.isNotBlank(customer.getNumeroDocumentoCompra())) {
                         //   List<AcreedorDTO> acreedores = acreedorMapper.obtenerAcreedorPorDocumento(customer);
                            customer.setCodigo_ce("0");
                    /*
                            if (acreedores.size() > 0) {
                                customer.setCodigo_ce("0");
                                if (StringUtils.isNotBlank(acreedores.get(0).getAcreedorId())) {
                                    customer.setAcreedorId(acreedores.get(0).getAcreedorId());
                                } else {
                                    customer.setAcreedorId(Constantes.ACREEDOR_ID_NO_EXISTE);
                                    customer.setCodigo_ce("2");
                                }

                                if (StringUtils.isNotBlank(acreedores.get(0).getRazonSocial())) {
                                    customer.setAcreedorRazonSocial(acreedores.get(0).getRazonSocial());
                                } else {
                                    customer.setAcreedorRazonSocial(Constantes.ACREEDOR_NOMBRE_NO_REGISTRADO);
                                    customer.setCodigo_ce("2");
                                }

                                if (StringUtils.isNotBlank(acreedores.get(0).getUsuario())) {
                                    customer.setUsuario(acreedores.get(0).getUsuario());
                                } else {
                                    customer.setUsuario(Constantes.ACREEDOR_NOMBRE_NO_REGISTRADO);
                                    customer.setCodigo_ce("2");

                                }
                                //  LOG.debug("CUSTOMER USUARIO"+customer.getUsuario());
                                if (acreedores.get(0).getFecha_creacion() != null) {
                                    customer.setFechaContable(acreedores.get(0).getFecha_creacion());
                                    // customer.setFechaContableOriginal(acreedores.get(0).getFecha_creacion());
                                } else {
                                    //   documentoAcreedorDTO  =checkPointMapper.findDateDocumento(customer)  ;
                                    //  customer.setFechaContable(documentoAcreedorDTO.getFechaDocumento());
                                    //    customer.setUsuario(documentoAcreedorDTO.getUsuario());
                                    customer.setCodigo_ce("2");
                                }


                            } else {
                                //documentoAcreedorDTO  =checkPointMapper.findDateDocumento(customer)  ;
                                customer.setCodigo_ce("0");
                                customer.setUsuario(customer.getUsuario() + "-FBL3N");
                                //  customer.setFechaContable(documentoAcreedorDTO.getFechaDocumento());
                                //  customer.setUsuario(documentoAcreedorDTO.getUsuario());

                            }*/

                        } else {
                            customer.setCodigo_ce("-1");
                            customer.setUsuario(customer.getUsuario() + "-SNP");
                        }
                    }

                    SociedadDTO sociedadDTO = null;
                    if (!TipoCuenta.CUENTA_RESUMEN.equals(customer.getTipoCuenta())) {
                        sociedadDTO = sociedadMapper.findBySociedadId(customer.getSociedadId());
                    }

                    ps.setString(1, customer.getAcreedorId());
                    ps.setString(2, customer.getAcreedorDocumento());
                    ps.setString(3, customer.getAcreedorRazonSocial());
                    ps.setString(4, customer.getAgrupacionCodigo());
                    if (customer.getAgrupacionId() != null) {
                        ps.setLong(5, customer.getAgrupacionId());
                    } else {
                        ps.setNull(5, Types.NUMERIC);
                    }

                    ps.setString(6, customer.getAgrupacionNombre());
                    ps.setString(7, customer.getAnuladoCon());
                    ps.setString(8, customer.getcPag());
                    ps.setString(9, customer.getCodigoBp());
                    ps.setString(10, customer.getCodigoClas());
                    ps.setString(11, customer.getCodigoIr());
                    ps.setString(12, customer.getCodigoLl());
                    ps.setString(13, customer.getCodigoMoneda());
                    ps.setString(14, customer.getCodigoVp());
                    ps.setString(15, customer.getCuentaContableId());

                    ps.setString(16, customer.getDocComp());
                    if (customer.getFechaBase() != null) {
                        ps.setDate(17, new java.sql.Date(customer.getFechaBase().getTime()));
                    } else {
                        ps.setNull(17, Types.DATE);
                    }

                    if (customer.getFechaContable() != null) {
                        ps.setDate(18, new java.sql.Date(customer.getFechaContable().getTime()));
                    } else {
                        ps.setNull(18, Types.DATE);
                    }

                    if (customer.getFechaDocumento() != null) {
                        ps.setDate(19, new java.sql.Date(customer.getFechaDocumento().getTime()));
                    } else {
                        ps.setNull(19, Types.DATE);
                    }

                    if (customer.getFechaVencimientoNeto() != null) {
                        ps.setDate(20, new java.sql.Date(customer.getFechaVencimientoNeto().getTime()));
                    } else {
                        ps.setNull(20, Types.DATE);
                    }

                    if (customer.getMontoMonedaDolares() != null) {
                        ps.setDouble(21, customer.getMontoMonedaDolares().doubleValue());
                    } else {
                        ps.setNull(21, Types.DOUBLE);
                    }

                    if (customer.getMontoMonedaLocal() != null) {
                        ps.setDouble(22, customer.getMontoMonedaLocal().doubleValue());
                    } else {
                        ps.setNull(22, Types.DOUBLE);
                    }
                    ps.setString(23, customer.getNumeroDocumento());
                    ps.setString(24, customer.getReferencia());
                    ps.setString(25, customer.getSociedadId());
                    if (sociedadDTO != null) {
                        ps.setString(26, sociedadDTO.getNombre());
                    } else {
                        ps.setNull(26, Types.VARCHAR);
                    }

                    ps.setString(27, customer.getTexto());
                    ps.setString(28, customer.getUsuario());
                    ps.setLong(29, customer.getCheckPointId());
                    ps.setString(30, customer.getNumeroDocumentoCompra());

                    if (TipoCuenta.CUENTA_ALMACEN.equals(customer.getTipoCuenta())) {
                        if (customer.getFechaContable() != null)
                            ps.setInt(31, DateUtil.tipoRango(customer.getFechaCorte(), customer.getFechaContable()));
                        else {
                            ps.setInt(31, 0);
                        }
                    } else {
                        if (customer.getFechaCorte() == null || customer.getFechaVencimientoNeto() == null) {
                            ps.setInt(31, 0);
                        } else {
                            ps.setInt(31, DateUtil.tipoRango(customer.getFechaCorte(), customer.getFechaVencimientoNeto()));
                        }
                    }
                    if (customer.getMontoImporteValorado() != null) {
                        ps.setDouble(32, customer.getMontoImporteValorado().doubleValue());
                    } else {
                        ps.setNull(32, Types.DOUBLE);
                    }

                    if (TipoCuenta.CUENTA_ALMACEN.equals(customer.getTipoCuenta())) {
                        if (customer.getFechaContable() != null)
                            ps.setInt(33, DateUtil.tipoRango(customer.getFechaDocumento(), customer.getFechaContable()));
                        else {
                            ps.setInt(33, 0);
                        }
                    } else {
                        if (customer.getFechaDocumento() == null || customer.getFechaVencimientoNeto() == null) {
                            ps.setInt(33, 0);
                        } else {
                            ps.setInt(33, DateUtil.tipoRango(customer.getFechaDocumento(), customer.getFechaVencimientoNeto()));
                        }


                    }

                    if (customer.getCodigo_ce() != null) {
                        ps.setString(34, customer.getCodigo_ce());
                    } else {
                        ps.setNull(34, Types.VARCHAR);
                    }

                    if (customer.getFechaContableOriginal() != null) {
                        ps.setDate(35, new java.sql.Date(customer.getFechaContableOriginal().getTime()));
                    } else {
                        ps.setNull(35, Types.DATE);
                    }
                    if (customer.getPosicion() != null) {
                        ps.setString(36, Long.parseLong(customer.getPosicion())/10 + "");
                    } else {
                        ps.setNull(36, Types.VARCHAR);
                    }
                    if (customer.getUsuarioTransaccional() != null) {
                        ps.setString(37, customer.getUsuarioTransaccional());
                    } else {
                        ps.setNull(37, Types.VARCHAR);
                    }
                }

                public int getBatchSize() {
                    return items.size();
                }
            });

            timeObserver.terminar();
            LOGGER.info(timeObserver.mostrarMsg() + " -> rows " + rows.length);
            if (checkPointId != null && LOGGER.isDebugEnabled()) {
                Integer registros = jdbcTemplate.queryForInt("select count(*) from dbo.SGTM_OPERACION_CUENTA  WITH(READPAST) where checkpoint_id = ? ", new Object[]{checkPointId});
                LOGGER.debug("registros en bd -> rows " + registros);


            }


        } catch (Exception ex) {
            ex.printStackTrace();

            throw ex;
        }

    }


}
